#include "STC15F2K60S2.H"      //必须，"STC-B学习板"使用MCU指定的头文件
#include "sys.H"                //必须，sys（MySTC_OS调度程序）头文件
#include "displayer.H"            //可选，display（显示模块）头文件。          
#include "key.H"               //可选，key（按键模块）头文件。
#include "hall.H"               //可选，hall（霍尔传感器模块）头文件。
#include "Vib.h"	             //可选，Vib（振动传感器模块）头文件。			
#include "beep.H"             //可选，beep（蜂鸣器模块）头文件。			
#include "music.h"             //可选，music（音乐播放）头文件。	
#include "adc.h"      //可选，adc（热敏、光敏、导航按键、扩展接口ADC）头文件	
#include "uart1.h"             //可选，uart1（串口1通信）头文件。
#include "uart2.h"             //可选，uart2（串口2通信）头文件。
#include "IR.h"	            //可选，38KHz红外通信
#include "stepmotor.h"        //可选，步进电机      
#include "DS1302.h"          //可选，DS1302实时时钟
#include "M24C02.h"         //可选，24C02非易失性存储器
#include "FM_Radio.h"	       //可选，FM收音机
#include "EXT.h"            //可选，EXT扩展接口（电子秤、超声波测距、旋转编码器、PWM输出控制电机快慢和正反转）
#include "oled.h"
#include "bmp.h"


code unsigned long SysClock=11059200;         //必须。定义系统工作时钟频率(Hz)，用户必须修改成与实际工作频率（下载时选择的）一致
//显示模块选用时必须。（数码管显示译码表，用戶可修改、增加等） 
/*
译码表原理解释：八位0000_0000到1111_1111对应数码管的段选，从右到左为abcdefgdp。
比如0，要abcdef,对应0011_1111=0x3f
比如带小数点的0，对应1011_1111=0x3f|0x80,也就是取小数点可以用|0x80(1000_0000)
*/
code char decode_table[]=
{0x3f, //显示0，序号0
0x06,//1,1
0x5b,//2,2
0x4f,//3,3
0x66,//4,4
0x6d,//5,5
0x7d,//6,6
0x07,//7,7
0x7f,//8,8
0x6f,//9,9
0x00,//无，10
0x08,//下-,11
0x40,//中-,12
0x01,//上-,13
0x41, //上中-,14
0x48, //中下-,15
0x3f|0x80,//带小数点0，16
0x06|0x80,//1,17
0x5b|0x80,//2,18
0x4f|0x80,//3,19
0x66|0x80,//4,20
0x6d|0x80,//5,21
0x7d|0x80,//6,22
0x07|0x80,//7,23
0x7f|0x80,//8,24
0x6f|0x80 //9,25
};  


// 时钟设置相关变量
int setting_mode = 0;        // 设置模式 0:不设置 1:设置小时 2:设置分钟 3:设置秒

// 番茄钟功能变量
int work_time = 25 * 60;     // 工作时间（默认25分钟）
int rest_time = 5 * 60;      // 休息时间（默认5分钟）
int current_time;            // 当前倒计时时间
int pomodoro_mode = 0;       // 番茄钟模式 0:工作 1:休息
int pomodoro_running = 0;    // 番茄钟运行状态 0:停止 1:运行
int pomodoro_finished = 0;   // 番茄钟完成状态
int mode = 0;                // 系统模式 0:时钟模式 1:番茄钟模式
int pomodoro_setting_mode = 0; // 番茄钟设置模式 0:不设置 1:设置工作时间 2:设置休息时间
int pomodoro_setting_item = 0; // 番茄钟设置项 0:分钟 1:秒钟

struct_DS1302_RTC time={0x30,0,16,22,8,1,0x22};  //举例。 实时时钟数据结构：秒、分、时、日、月、周、年。初值：2021年9月6日，周一，9：00：30
struct_DS1302_RTC tmp; 

void my1mS_callback()				               
{ 	
	if(mode == 0) {
		// 时钟模式
		// 正常显示时间
		tmp=RTC_Read();
		Seg7Print(tmp.hour/16,tmp.hour%16,12,tmp.minute/16,tmp.minute%16,12,tmp.second/16,tmp.second%16);
		
	} else {
		// 番茄钟模式
		if(pomodoro_setting_mode) {
			// 番茄钟设置模式
			static int blink_counter = 0;
			blink_counter++;
			
			if(pomodoro_setting_mode == 1) {
				// 设置工作时间
				int minutes = work_time / 60;
				int seconds = work_time % 60;
				
				if(blink_counter < 500) { // 前500ms显示
					// 无论设置分钟还是秒钟，都完整显示时间
					Seg7Print(10, 10, 10, minutes/10, minutes%10, 12, seconds/10, seconds%10); // "WO" + 分钟数 + 秒数
				} else if(blink_counter < 1000) { // 后500ms隐藏当前设置项
					if(pomodoro_setting_item == 0) {
						// 隐藏分钟设置
						Seg7Print(10, 10, 10, 10, 10, 12, seconds/10, seconds%10);
					} else {
						// 隐藏秒钟设置
						Seg7Print(10, 10, 10, minutes/10, minutes%10, 12, 10, 10);
					}
				} else {
					blink_counter = 0;
				}
			} else if(pomodoro_setting_mode == 2) {
				// 设置休息时间
				int minutes = rest_time / 60;
				int seconds = rest_time % 60;
				
				if(blink_counter < 500) { // 前500ms显示
					// 无论设置分钟还是秒钟，都完整显示时间
					Seg7Print(10, 10, 10, minutes/10, minutes%10, 12, seconds/10, seconds%10); // "rE" + 分钟数 + 秒数
				} else if(blink_counter < 1000) { // 后500ms隐藏当前设置项
					if(pomodoro_setting_item == 0) {
						// 隐藏分钟设置
						Seg7Print(10, 10, 10, 10, 10, 12, seconds/10, seconds%10);
					} else {
						// 隐藏秒钟设置
						Seg7Print(10, 10, 10, minutes/10, minutes%10, 12, 10, 10);
					}
				} else {
					blink_counter = 0;
				}
			}
		} else {
			int minutes ;
			int seconds ;
			// 番茄钟正常运行模式
			if(pomodoro_running && !pomodoro_finished) {
				static int counter = 0;
				counter++;
				if(counter >= 1000) { // 1秒计时
					counter = 0;
					if(current_time > 0) {
						current_time--;
					} else {
						// 当前阶段完成，切换到下一阶段
						if (pomodoro_mode == 0) {
							// 工作时间结束，开始休息
							pomodoro_mode = 1;
							current_time = rest_time;
						} else {
							// 休息时间结束，开始工作
							pomodoro_mode = 0;
							current_time = work_time;
						}
					}
				}
			}
			
			// 显示时间
			minutes = current_time / 60;
			seconds = current_time % 60;
			
			if(pomodoro_finished) {
				// 完成时显示"FINISH"
				Seg7Print(1, 2, 3,4, 10, 10, 10, 10);
			} else {
				// 显示倒计时 MM SS
				if (pomodoro_mode == 0) {
					// 工作模式显示 "WO" + 时间
					Seg7Print(10, 10, 10, minutes/10, minutes%10, 12, seconds/10, seconds%10);
				} else {
					// 休息模式显示 "rE" + 时间
					Seg7Print(10, 10, 10, minutes/10, minutes%10, 12, seconds/10, seconds%10);
				}
			}
		}
	}
}

void key_callback() {

	// 在番茄钟模式下，K1用于开始/暂停
	if(mode == 1 && GetKeyAct(enumKey1) == enumKeyPress) {
			// 正常番茄钟模式下，K1用于开始/暂停
			if(pomodoro_finished) {
				// 如果番茄钟已完成，重新开始工作时间
				current_time = work_time;
				pomodoro_mode = 0;
				pomodoro_finished = 0;
				pomodoro_running = 0;
			} else {
				// 切换运行/暂停状态
				pomodoro_running = !pomodoro_running;
			}
		}
	
	
	// 在番茄钟模式下，K2用于进入设置模式
	if(mode == 1 && GetKeyAct(enumKey2) == enumKeyPress) {
		if(!pomodoro_setting_mode) {
			// 进入设置模式，先设置工作时间
			pomodoro_setting_mode = 1;
			pomodoro_setting_item = 0; // 默认设置分钟
		} else if(pomodoro_setting_mode == 1) {
			// 切换到设置休息时间
			pomodoro_setting_mode = 2;
			pomodoro_setting_item = 0; // 默认设置分钟
		} else if(pomodoro_setting_mode == 2) {
			// 退出设置模式，回到正常模式
			pomodoro_setting_mode = 0;
			pomodoro_setting_item = 0;
			current_time = work_time;
			pomodoro_running = 0;
			pomodoro_mode = 0;
		}
	}
}

void mynav_callback() {
    	// 检查K3按键，用于切换模式
	if(GetAdcNavAct(enumAdcNavKey3) == enumKeyPress) {
		mode = !mode; // 切换模式
		
		if(mode == 1) {
			// 进入番茄钟模式，初始化番茄钟
			current_time = work_time;
			pomodoro_mode = 0;
			pomodoro_running = 0;
			pomodoro_finished = 0;

		} else {
			// 回到时钟模式，保存时间
			if(setting_mode) {
				RTC_Write(time);
			}
			// 退出番茄钟设置模式
			pomodoro_setting_mode = 0;
		}
	}
	// 处理导航按键（在番茄钟设置模式下）
	if(mode == 1 && pomodoro_setting_mode) {
		
		
		// 左右键切换设置项（分钟/秒钟）
		if(GetAdcNavAct(enumAdcNavKeyLeft) == enumKeyPress) {
			pomodoro_setting_item = !pomodoro_setting_item;
		}
		
		if(GetAdcNavAct(enumAdcNavKeyRight) == enumKeyPress) {
			pomodoro_setting_item = !pomodoro_setting_item;
		}
		
		// 上下键增加/减少时间设置值
		if(GetAdcNavAct(enumAdcNavKeyUp) == enumKeyPress) {
			// 增加时间
			if(pomodoro_setting_mode == 1) {
				// 调整工作时间
				if(pomodoro_setting_item == 0) {
					// 设置分钟
					if(work_time < 99 * 60) {  // 最多99分钟
						work_time += 60;
					}
				} else {
					// 设置秒钟
					if(work_time < 99 * 60 + 59) {  // 最多99分59秒
						work_time += 1;
						if(work_time % 60 == 0 && work_time > 59) {
							work_time -= 60; // 避免超过最大分钟数
						}
					}
				}
			} else if(pomodoro_setting_mode == 2) {
				// 调整休息时间
				if(pomodoro_setting_item == 0) {
					// 设置分钟
					if(rest_time < 99 * 60) {  // 最多99分钟
						rest_time += 60;
					}
				} else {
					// 设置秒钟
					if(rest_time < 99 * 60 + 59) {  // 最多99分59秒
						rest_time += 1;
						if(rest_time % 60 == 0 && rest_time > 59) {
							rest_time -= 60; // 避免超过最大分钟数
						}
					}
				}
			}
		}
		
		if(GetAdcNavAct(enumAdcNavKeyDown) == enumKeyPress) {
			// 减少时间
			if(pomodoro_setting_mode == 1) {
				// 调整工作时间
				if(pomodoro_setting_item == 0) {
					// 设置分钟
					if(work_time >= 60) {
						work_time -= 60;
					}
				} else {
					// 设置秒钟
					if(work_time > 0) {
						work_time -= 1;
						if(work_time % 60 == 59 && work_time < 99 * 60) {
							work_time += 60; // 避免出现负数分钟
						}
					}
				}
			} else if(pomodoro_setting_mode == 2) {
				// 调整休息时间
				if(pomodoro_setting_item == 0) {
					// 设置分钟
					if(rest_time >= 60) {
						rest_time -= 60;
					}
				} else {
					// 设置秒钟
					if(rest_time > 0) {
						rest_time -= 1;
						if(rest_time % 60 == 59 && rest_time < 99 * 60) {
							rest_time += 60; // 避免出现负数分钟
						}
					}
				}
			}
		}
		
		
	}
}



void main() 
{ 

	DisplayerInit();
	SetDisplayerArea(0,7);
	Seg7Print(10,10,10,10,10,10,10,10);
	DS1302Init(time);
    KeyInit();
	AdcInit(ADCincEXT);
	// 番茄钟初始化
	current_time = work_time;
	SetEventCallBack(enumEventSys1mS, my1mS_callback);
	SetEventCallBack(enumEventKey, key_callback);
    SetEventCallBack(enumEventNav, mynav_callback);

	
	
	MySTC_Init();	    
	while(1)             	
	{ 
		MySTC_OS();    
	}	             
}                 